package com.atguigu.yygh.hosp.service.impl;

import com.atguigu.yygh.Exception.YyghException;
import com.atguigu.yygh.cmn.client.DictFeignClient;
import com.atguigu.yygh.enums.DictEnum;
import com.atguigu.yygh.hosp.repository.HospitalRepository;
import com.atguigu.yygh.hosp.service.HospitalService;
import com.atguigu.yygh.model.hosp.Hospital;
import com.atguigu.yygh.vo.hosp.HospitalQueryVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Consumer;

@Service
public class HospitalServiceImpl implements HospitalService {
    @Autowired
    HospitalRepository hospitalRepository;

    @Autowired
    DictFeignClient dictFeignClient;//服务模块,实现远程调用cmn模块

    /**
     * 上传医院信息
     * @param hospital
     */
    @Override
    public void save(Hospital hospital) {
        //先判断hospital对象是否为空
        if (hospital!=null){
            //为不空,再往MongoDB中添加
            //先查询数据库中是否存在该hospital的信息:利用hoscode(医院编号)
            Hospital findHospital = hospitalRepository.findByHoscode(hospital.getHoscode());
            if (findHospital!=null){//不为空,说明存在,进行修改
                hospital.setStatus(findHospital.getStatus());//设置状态
                hospital.setUpdateTime(new Date());//设置更新时间
                hospital.setIsDeleted(0);//设置是否逻辑删除
                //设置查询出来数据id值   有id值才会进行修改,否则会添加导致重复添加报错
                hospital.setId(findHospital.getId());
                hospitalRepository.save(hospital);

            }else {//为空,说明不存在,进行添加
                hospital.setStatus(0);//设置状态
                hospital.setUpdateTime(new Date());//设置更新时间
                hospital.setCreateTime(new Date());//设置创建时间时间
                hospital.setIsDeleted(0);//设置是否逻辑删除
                hospitalRepository.save(hospital);
            }
        }else{
            //如果为空,抛出自定义异常
            throw new YyghException(20001,"数据错误");
        }
    }

    @Override
    public Hospital getHospByHoscode(String hoscode) {
        return hospitalRepository.findByHoscode(hoscode);
    }

    /**
     * 分页查询
     * @param page 当前页码
     * @param limit 每页记录数
     * @param hospitalQueryVo 查询条件
     */
    @Override
    public Page<Hospital> selectPage(Integer page, Integer limit, HospitalQueryVo hospitalQueryVo) {
        Sort sort = Sort.by(Sort.Direction.DESC, "createTime");
        Pageable pageable = PageRequest.of(page - 1, limit, sort);

        Hospital hospital = new Hospital();
        BeanUtils.copyProperties(hospitalQueryVo, hospital);

        //创建匹配器，即如何使用查询条件
        ExampleMatcher matcher = ExampleMatcher.matching() //构建对象
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) //改变默认字符串匹配方式：模糊查询
                .withIgnoreCase(true); //改变默认大小写忽略方式：忽略大小写
        Example<Hospital> of = Example.of(hospital, matcher);
        Page<Hospital> all = hospitalRepository.findAll(pageable);

        //获取分页数据中的Hospital集合
        List<Hospital> content = all.getContent();

        //使用流的方式对list进行遍历
/*        content.stream().forEach(new Consumer<Hospital>() {
            //封装医院等级,之前存的是 医院等级的code在dick表中对应的code值,非name值
            @Override
            public void accept(Hospital hospital) {
                packHospital(hospital);
            }
        });*/

        //封装医院等级,之前存的是 医院等级的code在dick表中对应的code值,非name值
        //使用流的方式对list进行遍历 利用lambda表达式
        content.stream().forEach( item ->{
            this.packHospital(item) ;
        });

        return all;
    }
    /**
     * 更新status(上线)状态,1为已上线,0为已下线
     * */
    @Override
    public void updateStatus(String id, Integer status) {
        if (status.intValue()==1||status.intValue()==0){//判断只有status的值为1或0时才执行

            //先根据id查询数据
            Hospital hospital = hospitalRepository.findById(id).get();
            if (hospital!=null){//如果查出来数据在进行更新
                hospital.setStatus(status);//设置状态
                hospital.setUpdateTime(new Date());//设置更新时间
                //执行更新操作
                hospitalRepository.save(hospital);
            }
        }
    }

    /**
     * 显示医院详情信息
     * */
    @Override
    public Hospital show(String id) {
       Hospital byId = hospitalRepository.findById(id).get();
        Hospital hospital = this.packHospital(byId);//封装医院等级名称,和地址 省名称+是名称+市名称
        return hospital;
    }
    /**
     * 根据医院编号获取医院的名称
     * */
    @Override
    public String getHospName(String hoscode) {
        Hospital byHoscode = hospitalRepository.findByHoscode(hoscode);
        String hosname = byHoscode.getHosname();
        return hosname;
    }

    /**
     * 封装数据 根据编号获取名称,并封装到hospital中的map集合里
     * */
    private Hospital packHospital(Hospital hospital) {
       String provinceString = dictFeignClient.getName(hospital.getProvinceCode());//根据省的编号获取名称
       String cityString = dictFeignClient.getName(hospital.getCityCode());//根据城市的编码获取名称
       String districtString = dictFeignClient.getName(hospital.getDistrictCode());//获取市的编码获取名称

        String hostypeString =  dictFeignClient.getName(DictEnum.HOSTYPE.getDictCode()
                ,hospital.getHostype());//获取医院等级的名称 DictEnum.HOSTYPE.getDictCode() 就等同于Hostype

        hospital.getParam().put("hostypeString", hostypeString);//封装医院等级
        //封装地址: 省的名称+市+区+地址
        hospital.getParam().put("fullAddress", provinceString + cityString + districtString + hospital.getAddress());
        //hospital中的getParam()是一个map集合,集合的类型是一个对象,
        return hospital;
    }



}
